---
title: "Elasticsearch API"
date: 2019-7-29
categories:
- elasticsearch
tags:
---

<div id="content">
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org056ce2c">Indices API :: 索引管理</a>
<ul>
<li><a href="#org37f44e5">列出所有索引</a></li>
<li><a href="#org4dac08b">删除索引</a></li>
</ul>
</li>
<li><a href="#org0cb214b">Index API :: 写入和更新index</a>
<ul>
<li><a href="#org7925096">获取索引信息</a>
<ul>
<li><a href="#org40ca43d">Path Variable</a></li>
<li><a href="#org9c858d2">Query Parameters</a></li>
</ul>
</li>
<li><a href="#org7720cfb">定入文档</a>
<ul>
<li><a href="#org3b8f1a2">Operation Type</a></li>
<li><a href="#orgd2dabd5">自动ID生成</a></li>
<li><a href="#orgaeb3c8a">乐观并发控制</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#org42655f8">Get API :: 通过ID获取文档</a>
<ul>
<li><a href="#org139c68f">GET twitter/_doc/0</a></li>
<li><a href="#orga19224c">HEAD twitter/_doc/0</a></li>
<li><a href="#org65df68c">Source Filtering</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="outline-2" id="outline-container-org056ce2c">
<h2 id="org056ce2c">Indices API :: 索引管理</h2>
<div class="outline-text-2" id="text-org056ce2c">
</div>
<div class="outline-3" id="outline-container-org37f44e5">
<h3 id="org37f44e5">列出所有索引</h3>
<div class="outline-text-3" id="text-org37f44e5">
<p>
GET /_cat/indices?v
</p>
</div>
</div>
<div class="outline-3" id="outline-container-org4dac08b">
<h3 id="org4dac08b">删除索引</h3>
<div class="outline-text-3" id="text-org4dac08b">
<pre class="example">
DELETE /twitter
</pre>
</div>
</div>
</div>
<div class="outline-2" id="outline-container-org0cb214b">
<h2 id="org0cb214b">Index API :: 写入和更新index</h2>
<div class="outline-text-2" id="text-org0cb214b">
</div>
<div class="outline-3" id="outline-container-org7925096">
<h3 id="org7925096">获取索引信息</h3>
<div class="outline-text-3" id="text-org7925096">
<p>
GET /{index_name}
</p>
<blockquote>
<p>
<a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.3/indices-get-index.html">https://www.elastic.co/guide/en/elasticsearch/reference/7.3/indices-get-index.html</a>
</p>
</blockquote>
</div>
<div class="outline-4" id="outline-container-org40ca43d">
<h4 id="org40ca43d">Path Variable</h4>
<div class="outline-text-4" id="text-org40ca43d">
<dl class="org-dl">
<dt>index_name</dt><dd>逗号分隔的索引名，或通配符表达式。传递 _all 则返回所有的索引</dd>
</dl>
</div>
</div>
<div class="outline-4" id="outline-container-org9c858d2">
<h4 id="org9c858d2">Query Parameters</h4>
<div class="outline-text-4" id="text-org9c858d2">
<dl class="org-dl">
<dt>allow_no_indices</dt><dd>boolean optional, 当值为true时，表示如果通配符或_all匹配不到索引或只有已头闭的索引，不要返回错误。</dd>
</dl>
</div>
</div>
</div>
<div class="outline-3" id="outline-container-org7720cfb">
<h3 id="org7720cfb">定入文档</h3>
<div class="outline-text-3" id="text-org7720cfb">
<blockquote>
<p>
<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html">https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html</a>
</p>
</blockquote>
<p>
向twitter的索引中写入id=1为的文档
</p>
<pre class="example">
PUT twitter/_doc/1
{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}
</pre>
<p>
Result:
</p>
<pre class="example">
{
    "_shards" : {
	"total" : 2,
	"failed" : 0,
	"successful" : 2
    },
    "_index" : "twitter",
    "_type" : "_doc",
    "_id" : "1",
    "_version" : 1,
    "_seq_no" : 0,
    "_primary_term" : 1,
    "result" : "created"
}
</pre>
<p>
_shards提供了index的复制（replication）过程的信息
</p>
<dl class="org-dl">
<dt>total</dt><dd>需要同步多少个副本（主和从）</dd>
<dt>successful</dt><dd>成功的复制，当successful至少为1时，index操作才是成功的。</dd>
<dt>failed</dt><dd>一个数组，当复制失败时，它包含了相关的错误</dd>
</dl>
<p>
当index操作成功返回时，复制过程不一定全部启动了（默认只有主结点是必须的，但是这种行为能<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html#index-wait-for-active-shards">更改</a>）。
这种情况下，total=基于number_of_replicas设置的总的分片数量；successful=已开始的复制。
如果没有出现错误，failed＝0
</p>
</div>
<div class="outline-4" id="outline-container-org3b8f1a2">
<h4 id="org3b8f1a2">Operation Type</h4>
<div class="outline-text-4" id="text-org3b8f1a2">
<p>
Index API接收一个op_type参数，用于强制 create 操作，即put-if-absent：当id已存在的时候，创建将失败。
</p>
<pre class="example">
PUT twitter/_doc/1?op_type=create
{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}
</pre>
<p>
另外一种方式是
</p>
<pre class="example">
PUT twitter/_create/1
{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}
</pre>
</div>
</div>
<div class="outline-4" id="outline-container-orgd2dabd5">
<h4 id="orgd2dabd5">自动ID生成</h4>
<div class="outline-text-4" id="text-orgd2dabd5">
<p>
当不指定id的时候，能够自动生成id，并且op_type将自动设置为create。
注意http method为POST
</p>
<pre class="example">
POST twitter/_doc/
{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}
</pre>
<p>
Result
</p>
<pre class="example">
{
    "_shards" : {
	"total" : 2,
	"failed" : 0,
	"successful" : 2
    },
    "_index" : "twitter",
    "_type" : "_doc",
    "_id" : "W0tpsmIBdwcYyG50zbta",
    "_version" : 1,
    "_seq_no" : 0,
    "_primary_term" : 1,
    "result": "created"
}
</pre>
</div>
</div>
<div class="outline-4" id="outline-container-orgaeb3c8a">
<h4 id="orgaeb3c8a">乐观并发控制</h4>
<div class="outline-text-4" id="text-orgaeb3c8a">
<p>
if_seq_no和if_primary_term，指定这两个值，只有当文档匹配这两个值的时候，操作才会执行。
如果不匹配，则抛出VersionConflictException，并返回409状态码。
</p>
</div>
</div>
</div>
</div>
<div class="outline-2" id="outline-container-org42655f8">
<h2 id="org42655f8">Get API :: 通过ID获取文档</h2>
<div class="outline-text-2" id="text-org42655f8">
</div>
<div class="outline-3" id="outline-container-org139c68f">
<h3 id="org139c68f">GET twitter/_doc/0</h3>
<div class="outline-text-3" id="text-org139c68f">
<p>
结果：
</p>
<pre class="example">
{
    "_index" : "twitter",
    "_type" : "_doc",
    "_id" : "0",
    "_version" : 1,
    "_seq_no" : 10,
    "_primary_term" : 1,
    "found": true,
    "_source" : {
	"user" : "kimchy",
	"date" : "2009-11-15T14:12:12",
	"likes": 0,
	"message" : "trying out Elasticsearch"
    }
}
</pre>
<p>
index不存在时，将返回错误：
</p>
<pre class="example">
{
  "error": {
    "root_cause": [
      {
	"type": "index_not_found_exception",
	"reason": "no such index [twitter]",
	"resource.type": "index_expression",
	"resource.id": "twitter",
	"index_uuid": "_na_",
	"index": "twitter"
      }
    ],
    "type": "index_not_found_exception",
    "reason": "no such index [twitter]",
    "resource.type": "index_expression",
    "resource.id": "twitter",
    "index_uuid": "_na_",
    "index": "twitter"
  },
  "status": 404
}
</pre>
</div>
</div>
<div class="outline-3" id="outline-container-orga19224c">
<h3 id="orga19224c">HEAD twitter/_doc/0</h3>
<div class="outline-text-3" id="text-orga19224c">
<p>
检查文档是否存在
</p>
</div>
</div>
<div class="outline-3" id="outline-container-org65df68c">
<h3 id="org65df68c">Source Filtering</h3>
<div class="outline-text-3" id="text-org65df68c">
<p>
使用 _source=false ，结果中不包含_source：
</p>
<pre class="example">
GET twitter/_doc/0?_source=false
</pre>
<p>
_source_excludes 和 _source_includes 用于指定需要的字段。
这两个参数都接收逗号分隔的字段列表或通配符表达式。
</p>
<pre class="example">
GET twitter/_doc/0?_source_includes=*.id&amp;_source_excludes=entities
</pre>
<p>
如果只需要includes，使用如下方式的缩写
</p>
<pre class="example">
GET twitter/_doc/0?_source=*.id,retweeted
</pre>
</div>
</div>
</div>
</div>
<div class="status" id="postamble">
<p class="date">Date: 2019-7-29</p>
<p class="author">Author: gdme1320</p>
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
